// 自己定义：保存 token
// 导入获取 token 的方法
import {
  getToken,
  setToken,
  delToken,
  setTimeStamp,
  removeTImeStamp
} from '@/utils/auth'
// 导入网络请求
import { loginApi, getInfoApi } from '@/api/user'
import { getBaseInfoApi } from '@/api/employees'
import { resetRouter } from '@/router/index'

const state = {
  // 存储 token
  token: getToken(), // 如果在 cookies 中已经有了，直接读取出来
  // 用户信息
  userInfo: {} // 给的是一个空对象，不建议设置为 null ，因为有可能会造成代码的错误
}

const mutations = {
  // 保存 token
  SET_TOKEN (state, payload) {
    // 只是将 token 保存在内存中：刷新后就没了
    state.token = payload
    // 还要保存到 cookies 中
    setToken(payload)
    // 顺便保存当前时间戳
    setTimeStamp()
  },
  // 清除 token
  REMOVE_TOKEN (state) {
    // 清除内存中的 token
    state.token = ''
    // 清除 cookie 中的 token
    delToken()
    // 清除 token 的时间戳
    removeTImeStamp()
  },
  // 保存 userInfo
  SET_USERINFO (state, payload) {
    state.userInfo = payload
  },
  // 清除 userInfo
  REMOVE_USERINFO (state) {
    state.userInfo = {}
  }
}

const actions = {
  // 保存 token
  async login (context, payload) {
    // 请求登录的接口，得到返回的 token
    // 接收返回的数据其实是响应拦截器中 return 回来的
    const res = await loginApi(payload)
    // 保存 token
    // 为什么服务器返回的是对象，token 在 data 中，而我们获取时需要通过 res.data.data 获取呢？
    //    因为 axios 接收到服务器返回的数据之后，会将数据包装到一个 data 属性中
    context.commit('SET_TOKEN', res.data)
  },
  // 得到用户信息
  async getUserInfo (context) {
    // 发送请求得到用户信息
    const res = await getInfoApi() // 得到用户的名称
    // 获取员工基本信息
    const baseRes = await getBaseInfoApi(res.data.userId)
    // 将两条数据合并到 userInfo 中 // 保存用户信息
    context.commit('SET_USERINFO', { ...res.data, ...baseRes.data })
    // 返回用户信息
    return res // 这里返回现在用不是，只是为后面写代码埋下伏笔
  },
  // 退出登录
  logout (context) {
    // 删除用户 token
    context.commit('REMOVE_TOKEN')
    // 删除用户信息： userInfo
    context.commit('REMOVE_USERINFO')
    // 重置路由：重置router/index.js 中的路由对象
    resetRouter()
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
